package My_ArraryList;

import java.util.Arrays;
class EmptyException extends RuntimeException{
    public EmptyException() {

    }

    public EmptyException(String msg) {
        super(msg);
    }
}
interface SqList {
    void add(int data);
    void add(int pos,int data);
    boolean contains(int toFind);
    int indexOf(int toFind);
    int get(int pos) ;
    void set(int pos,int value);
    void remove(int toRemove);
    int size();
    void clear();
    void display();
}

class My_Array implements SqList {
    private int[] array;
    private int usedsize;
    public static final int DEFAULT_CAPACITY = 5;
    public My_Array() {
        array = new int[DEFAULT_CAPACITY];
    }
    //打印数组 遍历打印的多种方式
    @Override
    public void display() {
        for (int i = 0; i < usedsize; i++) {
            System.out.print(array[i]+" ");
        }
        System.out.println();
    }
    //添加元素
    public boolean isFull() {
        return usedsize == array.length;
    }
    @Override
    public void add(int data) {
        //先要判断空间够不够（数组是否满）
        if(isFull()) {
            array = Arrays.copyOf(array,array.length*2);
        }
        array[usedsize] = data;
        usedsize++;
    }
    //首先需要判断输入的位置是否合理
    //然后判断数组是否满
    @Override
    public void add(int pos, int data) {
        if(pos<0||pos>usedsize) {
            System.out.println("输入位置非法");
            return;
        }
        if(isFull()) {
            array = Arrays.copyOf(array,array.length*2);
        }
        for (int i = usedsize; i > pos; i--) {
            array[i] = array[i-1];
        }
        array[pos] = data;
        usedsize++;
    }
    //能否否能找到某个数
    @Override
    public boolean contains(int toFind) {
        for (int i = 0; i < usedsize; i++) {
            if(toFind == array[i])
                return true;
        }
        System.out.println("找不到该数:"+toFind);
        return false;
    }
    //能否找到某个数，找到这个数后返回下标值
    @Override
    public int indexOf(int toFind) {
        for (int i = 0; i < usedsize; i++) {
            if(toFind == array[i])
                return i;
        }
        System.out.println("找不到该数:"+toFind);
        return -1;
    }

    //获取pos位置的数值
         //需要判断pos的值是否合法
    public void checkPosOfGet(int pos) {
        if(pos<0||pos >= usedsize){
            throw new EmptyException("pos位置不合法"+pos);
        }
    }
        //且需要判断顺序表是否为空
    public boolean isEmpty() {
        return usedsize == 0;
    }
    @Override
    public int get(int pos) {
        if(pos<0||pos > usedsize){
            checkPosOfGet(pos);
        }
        if(isEmpty()) {
            throw new EmptyException("顺序表为空");
        }
        return array[pos];
    }


    @Override
    public void set(int pos, int value) {
        checkPosOfGet(pos);
        if(isEmpty()) {
           throw new EmptyException("顺序表为空");
        }
        array[pos] = value;
    }
    //删除关键字 toRemove
    @Override
    public void remove(int toRemove) {
        if(isEmpty()) {
            throw new EmptyException("顺序表为空，不能删除");
        }
        if(contains(toRemove)) {
            int ret = indexOf(toRemove);
            for (int i = ret; i < usedsize - 1; i++) {
                array[i] = array[i + 1];
            }
            usedsize--;
        }
    }

    @Override
    public int size() {
        return usedsize;
    }

    @Override
    public void clear() {
        usedsize=0;
    }

}
public class My_ArraryList {
    public static void main(String[] args) {
        My_Array m1 = new My_Array();
        m1.add(1);
        m1.add(2);
        m1.add(0,99);
        m1.add(2,88);
        m1.add(4,4);
        m1.display();
        m1.remove(99);
        m1.remove(9);
        m1.remove(4);
        m1.display();
    }
}
